#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>

class Init
{
    public:
    Init()
    {
        umask(0);
        int n = ::mkfifo("fifo", 0666);
        if(n<0)
        {
            std::cerr<<"mkfifo error"<<std::endl;
            return;
        }

        std::cout<<"mkfifo success"<<std::endl;
    }
    ~Init()
    {
        int n =::unlink("fifo");

        if(n<0)
        {
            std::cerr<<"unlink error"<<std::endl;
            return;
        }
        std::cout<<"unlink success"<<std::endl;
    }
};

Init init;

class Reader
{
    public:
    Reader(int fd=-1):_fd(fd)
    {}

    void OpneFifo()//打开一个命名管道
    {
        _fd=::open("fifo",O_RDONLY);
        if(_fd<0)
        {
            std::cerr<<"open error"<<std::endl;
        }
    }

    int ReadPipe(std::string *out)//这是一个输出型参数，我们把读到的数据传给此参数
    {
        char buffer[1024];
        ssize_t n=::read(_fd,buffer,sizeof(buffer)-1);
        if(n>0)
        {
            buffer[n]='\0';
            *out=buffer;
        }
        return n;
    }

    void ClosePipe()
    {
        ::close(_fd);
    }
    private:
    int _fd;
};